package com.eps.tesoreria.controlador;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.eps.TO.AnoTO;
import com.eps.TO.LocalidadTO;
import com.eps.TO.TipoTO;
import com.eps.TO.ZonaTO;
import com.eps.entity.Parametros;
import com.eps.service.PedidoMgr;
import com.eps.service.ServicioTO;
import com.eps.sumi.WelcomeController;
import com.eps.tesoreria.TO.BancoTO;
import com.eps.tesoreria.TO.CajaOperacionBancariaTO;
import com.eps.tesoreria.TO.ClienteTO;
import com.eps.tesoreria.TO.ComparativoFlujoTO;
import com.eps.tesoreria.TO.CuentaContableTO;
import com.eps.tesoreria.TO.CuentaEmpresaTO;
import com.eps.tesoreria.TO.DetalleLiquidacionCobranzaTO;
import com.eps.tesoreria.TO.DetallePlanillaTO;
import com.eps.tesoreria.TO.DetalleRendicionCajaChicaTO;
import com.eps.tesoreria.TO.FondoFijoTO;
import com.eps.tesoreria.TO.LiquidacionCobranzaTO;
import com.eps.tesoreria.TO.PagoCajaTO;
import com.eps.tesoreria.TO.PlanillaAprobacionTO;
import com.eps.tesoreria.TO.PlanillaTO;
import com.eps.tesoreria.TO.RendicionCajaChicaTO;
import com.eps.tesoreria.logica.LogicaCajaChica;
import com.eps.tesoreria.logica.LogicaFlujoCaja;
import com.eps.tesoreria.logica.LogicaLiquidacionCobranza;
import com.eps.tesoreria.logica.LogicaOperacionesCajeros;
import com.eps.tesoreria.logica.LogicaPlanilla;
import com.eps.util.Utiles_Importar;

;
/**
 * Handles requests for the application welcome page.
 */
@Controller
public class TesoreriaController {

	@Autowired
	private LogicaCajaChica logica_cajachica;
	
	@Autowired
	private LogicaLiquidacionCobranza logica_liquidacion;

	@Autowired
	private LogicaPlanilla logica_planilla;

	@Autowired
	private WelcomeController controlador_listas;

	@Autowired
	private PedidoMgr pedido_service;
	
	@Autowired
	private LogicaOperacionesCajeros logica_operaciones_cajeros;

	@Autowired
	@Qualifier("servicio_to")
	private ServicioTO servicio_to;

	@Autowired
	private LogicaFlujoCaja logica_flujo;
	
	
	// mensajes de log
	private static final Logger logger = LoggerFactory
			.getLogger(TesoreriaController.class);

	public TesoreriaController() {
		logger.info("inicia Contolador Tesoreria");
	}

	// vista de formulario de caja chica
	@RequestMapping(value = "/frmcajachica.htm", method = RequestMethod.GET)
	public ModelAndView frmcajachica(@RequestParam String id_rendicion,@RequestParam int id_fondofijo,HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/frmcajachica");
		List<ZonaTO> zonas = controlador_listas.getServicio_to()
				.getListaZonasPorUsuario(user);
		mv.addObject("lista_zonas", zonas);
		mv.addObject("id_rendicion", id_rendicion);
		
		try {
			/*
			 * mv.addObject("lista_fondos", logica_cajachica
			 * .getListaFondosFijosPorZona(zonas.get(0).getId_zona()));
			 */
			List<FondoFijoTO> fondos_fijos = controlador_listas
					.getServicio_to().getListaFondosFijosPorUsuario(user,
							zonas.get(0).getId_zona());
			FondoFijoTO fondo_selected = controlador_listas.getServicio_to().getListaFondoFijoPorId(id_fondofijo);
			mv.addObject("lista_fondos", fondos_fijos);
			mv.addObject("fondo_selected", fondo_selected);
			if(id_rendicion!=null && id_rendicion.trim().length()>0)
				mv.addObject("edicion", logica_cajachica.verificaEdicionDeRendicion(id_rendicion));
			else
				mv.addObject("edicion", true);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}
	
	// vista de formulario de administracion de caja chica
	@RequestMapping(value = "/frmAdministra_cajachica.htm", method = RequestMethod.GET)
	public ModelAndView frmAdministra_cajachica(HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/frmAdministra_cajachica");
		List<ZonaTO> zonas = controlador_listas.getServicio_to()
				.getListaZonasPorUsuario(user);
		mv.addObject("lista_zonas", zonas);
		try {
			/*
			 * mv.addObject("lista_fondos", logica_cajachica
			 * .getListaFondosFijosPorZona(zonas.get(0).getId_zona()));
			 */
			List<FondoFijoTO> fondos_fijos = controlador_listas
					.getServicio_to().getListaFondosFijosPorUsuario(user,
							zonas.get(0).getId_zona());
			mv.addObject("lista_fondos", fondos_fijos);
			mv.addObject("monto_base", fondos_fijos.get(0).getMonto_base());

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}

	@RequestMapping(value = "/frmaprobarPlanillas.htm", method = RequestMethod.GET)
	public ModelAndView frmaprobarPlanilla(HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/frmAprobacionPlanillas");
		List<AnoTO> lista_anios = new ArrayList<AnoTO>();
		List<AnoTO> lista_meses = new ArrayList<AnoTO>();
		try {
			lista_anios = logica_planilla.getAniosPlanillas();
			lista_meses = logica_planilla.getMesesPlanillas();
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		for (AnoTO anio : lista_meses) {
			if (anio.getMes().compareTo("01") == 0)
				anio.setNombMes("ENERO");
			if (anio.getMes().compareTo("02") == 0)
				anio.setNombMes("FEBRERO");
			if (anio.getMes().compareTo("03") == 0)
				anio.setNombMes("MARZO");
			if (anio.getMes().compareTo("04") == 0)
				anio.setNombMes("ABRIL");
			if (anio.getMes().compareTo("05") == 0)
				anio.setNombMes("MAYO");
			if (anio.getMes().compareTo("06") == 0)
				anio.setNombMes("JUNIO");
			if (anio.getMes().compareTo("07") == 0)
				anio.setNombMes("JULIO");
			if (anio.getMes().compareTo("08") == 0)
				anio.setNombMes("AGOSTO");
			if (anio.getMes().compareTo("09") == 0)
				anio.setNombMes("SETIEMBRE");
			if (anio.getMes().compareTo("10") == 0)
				anio.setNombMes("OCTUBRE");
			if (anio.getMes().compareTo("11") == 0)
				anio.setNombMes("NOVIEMBRE");
			if (anio.getMes().compareTo("12") == 0)
				anio.setNombMes("DICIEMBRE");
		}
		mv.addObject("lista_anios", lista_anios);
		mv.addObject("lista_meses", lista_meses);
		List<PlanillaTO> lista = new ArrayList<PlanillaTO>();
		Parametros p = pedido_service.getParametrosID("TE1");
		String ano = p.getParam1();
		String mes = p.getParam2();
		try {
			lista = logica_planilla.obtenerPlanillasAprobacion(user, ano, mes);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		mv.addObject("detalle_planilla", lista);
		return mv;
	}

	// Fondos Fijos Por Zona
	@RequestMapping(value = "/fondo_en_zona", method = RequestMethod.GET)
	public @ResponseBody
	List<FondoFijoTO> getLocalidadesEnZona(@RequestParam String zona,
			HttpServletResponse response) throws Exception {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		
		return controlador_listas.getServicio_to().getListaFondosFijosPorUsuario(user,zona);
	}

	@RequestMapping(value = "/jdDetalleRendicion", method = RequestMethod.POST)
	public ModelAndView jdDetalleRendicion() {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/jdDetalleRendicion");
		mv.addObject("lista_empresas", controlador_listas.getEmpresas("principal"));
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getListaZonasPorUsuario(user);
		mv.addObject("tipos_comprobantes", controlador_listas.getServicio_to().getListaTiposTabla("tipo_Documento"));
		
		List<TipoTO> plantillas_impuesto = controlador_listas.getServicio_to().getTipo_porTabla("Tipo_Plantilla");
		Collections.sort(plantillas_impuesto);
		Collections.reverse(plantillas_impuesto);
		mv.addObject("tipos_impuesto", plantillas_impuesto);
		// mv.addObject("detalle", detalle);
		return mv;
	}

	@RequestMapping(value = "/get_detalles_rendicion", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getDetallesRendicion(
			@RequestParam String id_rendicion, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<DetalleRendicionCajaChicaTO> lista = logica_cajachica
				.getDetalleRendicionChica(id_rendicion.trim());
		Map data = new HashMap();
		data.put("page", page);
		data.put("rows", lista);
		data.put("userdata", Collections.singletonMap("monto_total", 240.00));
		// return Collections.singletonMap("rows", lista);
		return data;
	}

	// Cuentas Contables de Caja Chica por Digito
	@RequestMapping(value = "/get_cuentas_digito", method = RequestMethod.GET)
	public @ResponseBody
	List<CuentaContableTO> getCuentasCajaChicaPorDigito(@RequestParam String q,
			@RequestParam int limit, HttpServletRequest request,
			HttpServletResponse response) {
		List<CuentaContableTO> retorno = new ArrayList<CuentaContableTO>(1);
		List<CuentaContableTO> cuentas = controlador_listas.getServicio_to()
				.getCta_ctblesCajaChica();
		int indice = 0;
		for (CuentaContableTO cuenta : cuentas) {
			if (indice == limit)
				break;
			if (cuenta.getIdCuentaContable().trim().length() >= q.length()) {
				if (cuenta.getIdCuentaContable().trim()
						.substring(0, q.length()).equalsIgnoreCase(q)) {
					retorno.add(cuenta);
					indice++;
				}
			}
		}
		return retorno;
	}
	
	// Cuentas Contables de Caja Chica por Digito
	@RequestMapping(value = "/get_cuentas_cobranza", method = RequestMethod.GET)
	public @ResponseBody
	List<CuentaContableTO> getCuentasCobranzaPorDigito(@RequestParam String q,
			@RequestParam int limit, HttpServletRequest request,
			HttpServletResponse response) {
		List<CuentaContableTO> retorno = new ArrayList<CuentaContableTO>(1);
		List<CuentaContableTO> cuentas = controlador_listas.getServicio_to()
				.getCta_ctblesCobranza();
		int indice = 0;
		for (CuentaContableTO cuenta : cuentas) {
			if (indice == limit)
				break;
			if (cuenta.getIdCuentaContable().trim().length() >= q.length()) {
				if (cuenta.getIdCuentaContable().trim()
						.substring(0, q.length()).equalsIgnoreCase(q)) {
					retorno.add(cuenta);
					indice++;
				}
			}
		}
		return retorno;
	}

	// Cuentas Contables de Caja Chica por Descripcion
	@RequestMapping(value = "/get_cuentas_descripcion", method = RequestMethod.GET)
	public @ResponseBody
	List<CuentaContableTO> getCuentasCajaChicaPorDescripcion(
			@RequestParam String q, @RequestParam int limit,
			HttpServletRequest request, HttpServletResponse response) {
		List<CuentaContableTO> retorno = new ArrayList<CuentaContableTO>(1);
		List<CuentaContableTO> cuentas = controlador_listas.getServicio_to()
				.getCta_ctblesCajaChica();
		int indice = 0;
		for (CuentaContableTO cuenta : cuentas) {
			if (indice == limit)
				break;
			if (cuenta.getDescripcion().trim().length() >= q.length()) {
				if (cuenta.getDescripcion().trim().substring(0, q.length())
						.equalsIgnoreCase(q)) {
					retorno.add(cuenta);
					indice++;
				}
			}
		}
		return retorno;
	}

	@RequestMapping(value = "/getMontoBase_cajachica", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getMontoBaseCajachica(
			@RequestParam int id_fondofijo, HttpServletRequest request,
			HttpServletResponse response) {
		BigDecimal monto_base = BigDecimal.ZERO;
		try {
			monto_base = controlador_listas.getServicio_to().getListaFondoFijoPorId(id_fondofijo).getMonto_base();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", monto_base);
	}

	// TRabajadores de Caja Chica
	/*
	 * @RequestMapping(value = "/get_trabajadores", method = RequestMethod.GET)
	 * public @ResponseBody List<TrabajadorTO> getTrabajadores(@RequestParam
	 * String q,
	 * 
	 * @RequestParam int limit, HttpServletRequest request, HttpServletResponse
	 * response) { List<TrabajadorTO> retorno = new ArrayList<TrabajadorTO>(1);
	 * List<TrabajadorTO> trabajadores =
	 * controlador_listas.getServicio_to().getTrabajadoresActivos(); int indice
	 * = 0; for (TrabajadorTO trabajador : trabajadores) { if (indice == limit)
	 * break; if (trabajador.getFull_nombre().trim().length() >= q.length()) {
	 * if (trabajador.getFull_nombre().trim() .substring(0,
	 * q.length()).equalsIgnoreCase(q)) { retorno.add(trabajador); indice++; } }
	 * } return retorno; }
	 */
	@RequestMapping(value = "/get_planillas", method = RequestMethod.GET)
	public @ResponseBody
	List<PlanillaTO> getDetallesPlanillas(@RequestParam String ano,
			@RequestParam String mes, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		List<PlanillaTO> lista = logica_planilla.obtenerPlanillasAprobacion(
				user, ano, mes);

		return lista;
	}

	@RequestMapping(value = "/get_consulta_detalleplanilla", method = RequestMethod.GET)
	public ModelAndView getConsultaDetallePlanilla(
			@RequestParam String codplanilla) {
		ModelAndView mv = new ModelAndView("tesoreria/tabla_detalle_planilla");
		List<DetallePlanillaTO> lista = new ArrayList<DetallePlanillaTO>(1);
		try {
			lista = logica_planilla.obtenerDetallesPlanilla(codplanilla);
		} catch (Exception e) {
			e.printStackTrace();
		}
		mv.addObject("lista_detallesPlanillas", lista);
		return mv;
	}

	@RequestMapping(value = "/aprobar_planillas", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> aprobarPlanillas(
			@RequestBody PlanillaAprobacionTO aprobacion,
			HttpServletRequest request, HttpServletResponse response) {
		String operacion = "";
		try {
			String usuario = ((UserDetails) SecurityContextHolder.getContext()
					.getAuthentication().getPrincipal()).getUsername();
			List<PlanillaTO> detallePlanilla = aprobacion.getDetalle().get(
					"detalle");
			operacion = logica_planilla.aprobarPlanilla(usuario,
					detallePlanilla);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", operacion);
	}
	
	@RequestMapping(value = "/guardar_rendicion", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> insertarRendicion(
			@RequestBody RendicionCajaChicaTO rendicion,
			HttpServletRequest request, HttpServletResponse response) {
		boolean operacion =false;
		try {
			String usuario = ((UserDetails) SecurityContextHolder.getContext()
					.getAuthentication().getPrincipal()).getUsername();
			operacion = logica_cajachica.insertarRendicionCajaChica(rendicion,usuario);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", operacion);
	}

	@RequestMapping(value = "/get_rendiciones_fondo", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getRendicionesPorFondo(
			@RequestParam int id_fondofijo, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<RendicionCajaChicaTO> lista = logica_cajachica.getRendicionesPorFondoFijo(id_fondofijo);
		Map data = new HashMap();
		data.put("page", page);
		data.put("rows", lista);
		// return Collections.singletonMap("rows", lista);
		return data;
	}
	
	// rendir caja chica
	@RequestMapping(value = "/rendir_cajachica", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> rendirCajachica(@RequestParam String id_rendicion,
			HttpServletRequest request, HttpServletResponse response) {
		String usuario = ((UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername();

		Map respuesta = new HashMap();
		try {
			respuesta.put("mensaje", (logica_cajachica.rendirCajaChica(id_rendicion))?"SE REALIZO CORRECTAMENTE LA OPERACION":"SE PRODUJO UN ERROR");
			respuesta.put("respuesta", true);
		} catch (Exception e) {
			e.printStackTrace();
			respuesta.put("mensaje", e.getMessage());
			respuesta.put("respuesta", false);
		}

		// return Collections.singletonMap("respuesta", respuesta);
		return respuesta;
	}
	
	// verificar aperturar neuva rendicion
	@RequestMapping(value = "/apertura_cajachica", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> aperturarCajachica(@RequestParam int id_fondofijo,
			HttpServletRequest request, HttpServletResponse response) {
		String usuario = ((UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername();

		Map respuesta = new HashMap();
		try {
			respuesta.put("mensaje", (logica_cajachica.aperturarCajaChica(id_fondofijo))?"SE REALIZO CORRECTAMENTE LA OPERACION":"SE PRODUJO UN ERROR");
			respuesta.put("respuesta", true);
		} catch (Exception e) {
			e.printStackTrace();
			respuesta.put("mensaje", e.getMessage());
			respuesta.put("respuesta", false);
		}

		// return Collections.singletonMap("respuesta", respuesta);
		return respuesta;
	}
	
	// vista de formulario de pedidos
	@RequestMapping(value = "/frmliquidacion.htm", method = RequestMethod.GET)
	public ModelAndView frmpedidos(
			HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/liquidacion_cobranza/frmliquidacion");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getListaZonasPorUsuario(user);
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		return mv;
	}
	
	@RequestMapping(value = "/guardar_liquidacion", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> insertarLiquidacionCobranza(
			@RequestBody LiquidacionCobranzaTO liquidacion,
			HttpServletRequest request, HttpServletResponse response) {
		boolean operacion =false;
		try {
			String usuario = ((UserDetails) SecurityContextHolder.getContext()
					.getAuthentication().getPrincipal()).getUsername();
			liquidacion.setUsuario(usuario);
			operacion = logica_liquidacion.insertarLiquidacionCobranza(liquidacion);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", operacion);
	}
	
	// vista de consulta de liquidacion de cobranza
	@RequestMapping(value = "/frmConsulta_liquidacion.htm", method = RequestMethod.GET)
	public ModelAndView frmConsultaLiquidacion(HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/liquidacion_cobranza/frmConsultaLiquidacion");
		List<ZonaTO> zonas = controlador_listas.getServicio_to()
				.getListaZonasPorUsuario(user);
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		mv.addObject("lista_anios", controlador_listas.getServicio_to().getAnios());
		mv.addObject("lista_meses", controlador_listas.getServicio_to().getListaMesPorAnioFirst());
		return mv;
	}
	
	@RequestMapping(value = "/get_liquidaciones_zona", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getLiquidacionesPorZona(
			@RequestParam String id_zona,@RequestParam String id_localidad,
			@RequestParam String mes,@RequestParam String anio, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<LiquidacionCobranzaTO> lista = logica_liquidacion.getLiquidacionesPorZona(id_zona, id_localidad, anio, mes);
		Map data = new HashMap();
		data.put("page", page);
		data.put("rows", lista);
		// return Collections.singletonMap("rows", lista);
		return data;
	}
	@RequestMapping(value = "/get_distribucioncheque_zona", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getDistribucionChequePorZona(
			@RequestParam String id_zona,@RequestParam String id_localidad,
			@RequestParam String fecha, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
				List<CajaOperacionBancariaTO> lista = this.logica_operaciones_cajeros.getDistribucionesporCheque(id_zona, id_localidad, fecha);
				Map data = new HashMap();
				data.put("page", page);
				data.put("rows", lista);
				// return Collections.singletonMap("rows", lista);
		     return data;
	}
	
	@RequestMapping(value = "/get_detalle_liquidacion", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getDetalleLiquidacionPorCodigo(
			@RequestParam String id_liquidacion, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<DetalleLiquidacionCobranzaTO> lista = logica_liquidacion.getDetalleLiquidacionCobranza(id_liquidacion);
		Map data = new HashMap();
		data.put("page", page);
		data.put("rows", lista);
		// return Collections.singletonMap("rows", lista);
		return data;
	}
	

	@RequestMapping(value = "/jdAgregaClientePagoCaja", method = RequestMethod.POST)
	public ModelAndView verDetalleAgregarCliente() {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/jdAgregaClientePagoCaja");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getZonas();
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		
		return mv;
	}
	
	@RequestMapping(value = "/jdDetalleLiquidacion", method = RequestMethod.GET)
	public ModelAndView verDetalleLiquidacion(@RequestParam String id_liquidacion) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/liquidacion_cobranza/jdDetalleLiquidacion");
		mv.addObject("id_liquidacion", id_liquidacion);
		// mv.addObject("detalle", detalle);
		return mv;
	}
	
	@RequestMapping(value = "/frmRegistrarPagoCaja.htm", method = RequestMethod.GET)
	public ModelAndView frmRegistrarPagoCaja(HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/frmRegistrarPagoCaja");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getZonas();
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		List<ZonaTO> zonasp = controlador_listas.getServicio_to().getListaZonasPorUsuario(user);
		mv.addObject("lista_zonasp", zonasp);
		mv.addObject("lista_localidadesp", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonasp.get(0).getId_zona()));
		mv.addObject("lista_pago", servicio_to.getTipo_porTabla("tipos_pago"));
		return mv;
	}
	@RequestMapping(value = "/frmConsultarPagoCaja.htm", method = RequestMethod.GET)
	public ModelAndView frmConsultarPagoCaja(HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/frmConsultarPagoCaja");
		List<ZonaTO> zonas = controlador_listas.getServicio_to()
				.getListaZonasPorUsuario(user);
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getListaLocalidadesPorUsuario(user,zonas.get(0).getId_zona()));
		
		return mv;
	}
	
	// vista de formulario de registro de depositos de cobranza
	@RequestMapping(value = "/frmRegistrarVoucherCobranza.htm", method = RequestMethod.GET)
	public ModelAndView frmDepositoCobranza(
			HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/frmRegistrarVoucherCobranza");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getListaZonasPorUsuario(user);
		List<BancoTO> bancos=controlador_listas.getServicio_to().getListaBancos();
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getListaLocalidadesPorUsuario(user,zonas.get(0).getId_zona()));
		//mv.addObject("lista_localidades", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		mv.addObject("lista_bancos",bancos );
		mv.addObject("lista_cuentas", controlador_listas.getServicio_to().getListaCuentasPorBanco(bancos.get(0).getId_banco()));
		return mv;
	}
	@RequestMapping(value = "/frmRegistrarCajaOperacionBancaria.htm", method = RequestMethod.GET)
	public ModelAndView frmRegistrarCajaOperacionBancaria(
			HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/frmRegistrarCajaOperacionBancaria");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getListaZonasPorUsuario(user);
		List<BancoTO> bancos=controlador_listas.getServicio_to().getListaBancos();
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getListaLocalidadesPorUsuario(user,zonas.get(0).getId_zona()));
		//mv.addObject("lista_localidades", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		mv.addObject("lista_bancos",bancos );
		mv.addObject("lista_cuentas", controlador_listas.getServicio_to().getListaCuentasPorBanco(bancos.get(0).getId_banco()));
		return mv;
	}
	
	@RequestMapping(value = "/frmAdminVoucherCobranza.htm", method = RequestMethod.GET)
	public ModelAndView frmAdminDepositoCobranza(
			HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/frmAdminVoucherCobranza");
		List<BancoTO> bancos=controlador_listas.getServicio_to().getListaBancos();
		mv.addObject("lista_bancos",bancos );
		mv.addObject("lista_cuentas", controlador_listas.getServicio_to().getListaCuentasPorBanco(bancos.get(0).getId_banco()));
		return mv;
	}
	
	@RequestMapping(value = "/guardar_pago", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> guardarPago(
			@RequestBody PagoCajaTO registro,
			HttpServletRequest request, HttpServletResponse response) {
		String codigo ="";
		try {
			String usuario = ((UserDetails) SecurityContextHolder.getContext()
					.getAuthentication().getPrincipal()).getUsername();
			codigo = logica_planilla.registrarPagoCaja(usuario, registro);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("codigo", codigo);
	}
	@RequestMapping(value = "/guardar_cliente", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> guardarCliente(
			@RequestBody ClienteTO registro,
			HttpServletRequest request, HttpServletResponse response) {
		String codigo ="";
		try {
			codigo = logica_planilla.registrarCliente(registro);
			servicio_to.cargarClientes();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("codigo", codigo);
	}
	@RequestMapping(value = "/get_consulta_pagoscaja", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getConsultaPagosCaja(
			@RequestParam String id_zona,@RequestParam String id_localidad,
			@RequestParam String fecha, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<PagoCajaTO> lista = logica_planilla.consultarPagosCaja(fecha, id_zona, id_localidad);
		Map data = new HashMap();
		data.put("page", page);
		data.put("rows", lista);
		// return Collections.singletonMap("rows", lista);
		return data;
	}
	@RequestMapping(value = "/get_detalle_distribucioncheque", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> get_detalle_distribucioncheque(
			@RequestParam String id_caja_operacion_bancaria, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<PagoCajaTO> lista = this.logica_operaciones_cajeros.getDetalleDistribucionesporCheque(id_caja_operacion_bancaria);
		Map data = new HashMap();
		data.put("page", page);
		data.put("rows", lista);
		// return Collections.singletonMap("rows", lista);
		return data;
	}
	
	@RequestMapping(value = "/eliminar_distribucioncheque", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> eliminar_distribucioncheque(
			@RequestBody CajaOperacionBancariaTO registro,
			HttpServletRequest request, HttpServletResponse response) {
		boolean operacion =false;
		try {
			System.out.println("operacion"+registro.getId_caja_operacion_bancaria());
			operacion = this.logica_operaciones_cajeros.eliminar_distribucioncheque(registro);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", operacion);
		
	}
	@RequestMapping(value = "/eliminar_pagocaja", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> eliminar_pagocaja(
			@RequestBody PagoCajaTO registro,
			HttpServletRequest request, HttpServletResponse response) {
		boolean operacion =false;
		try {
			operacion = this.logica_planilla.eliminar_pagocaja(registro);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", operacion);
		
	}
	
	// Fondos Fijos Por Zona
	@RequestMapping(value = "/cuenta_en_banco", method = RequestMethod.GET)
	public @ResponseBody
	List<CuentaEmpresaTO> getCuentaEnBanco(@RequestParam String id_banco,
			HttpServletResponse response) throws Exception {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		
		return controlador_listas.getServicio_to().getListaCuentasPorBanco(id_banco);
	}
	
	@RequestMapping(value = "/jdDetalleDistribucion", method = RequestMethod.POST)
	public ModelAndView jdDetalleDistribucion() {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/jdAgregaItemDepositoCaja");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getListaZonasPorUsuario(user);
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		// mv.addObject("detalle", detalle);
		return mv;
	}
	@RequestMapping(value = "/jdDetalleOperacion", method = RequestMethod.POST)
	public ModelAndView jdDetalleOperacion() {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/jdDetalleOperacion");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getZonas();
		mv.addObject("lista_zonasp", zonas);
		mv.addObject("lista_localidadesp", controlador_listas.getServicio_to().getLocalidadZonaComercial(zonas.get(0).getId_zona()));
		return mv;
	}
	
	@RequestMapping(value = "/guardar_distribucion_deposito", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> insertarDistribucionDeposito(
			@RequestBody CajaOperacionBancariaTO distribucion,
			HttpServletRequest request, HttpServletResponse response) {
		boolean operacion =false;
		try {
			System.out.println(distribucion.getFecha());
			System.out.println(distribucion.getImporte().toPlainString());
			System.out.println(distribucion.getNum_operacion());
			String usuario = ((UserDetails) SecurityContextHolder.getContext()
					.getAuthentication().getPrincipal()).getUsername();
			//liquidacion.setUsuario(usuario);
			operacion = logica_operaciones_cajeros.registraDistribucionDepositoBancario(distribucion);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", operacion);
	}
	@RequestMapping(value = "/guardar_distribucion_cheque", method = RequestMethod.POST)
	public @ResponseBody
	Map<String, ? extends Object> insertarDistribucionCheque(
			@RequestBody CajaOperacionBancariaTO distribucion,
			HttpServletRequest request, HttpServletResponse response) {
		boolean operacion =false;
		try {
			System.out.println(distribucion.getFecha());
			System.out.println(distribucion.getImporte().toPlainString());
			System.out.println(distribucion.getNum_operacion());
			String usuario = ((UserDetails) SecurityContextHolder.getContext()
					.getAuthentication().getPrincipal()).getUsername();
			//liquidacion.setUsuario(usuario);
			operacion = logica_operaciones_cajeros.registraDistribucionCheque(usuario,distribucion);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Collections.singletonMap("operacion", operacion);
	}
	
	
	@RequestMapping(value = "/get_depositos_cuenta", method = RequestMethod.GET)
	public @ResponseBody
	Map<String, ? extends Object> getDepositosPorCuenta(
			@RequestParam String id_cuenta, @RequestParam int page,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<CajaOperacionBancariaTO> lista = logica_operaciones_cajeros.getDepositosporCuenta(id_cuenta);
		Map data = new HashMap();
		data.put("page", page);
		data.put("rows", lista);
		// return Collections.singletonMap("rows", lista);
		return data;
	}
	
	@RequestMapping(value = "/jdVerDetalleOperacionCheque", method = RequestMethod.GET)
	public ModelAndView jdVerDetalleOperacionCheque(@RequestParam String id_caja_operacion_bancaria) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/jdVerDetalleOperacionCheque");
		//mv.addObject("id_liquidacion", id_liquidacion);
		 try {
			 mv.addObject("id_caja_operacion_bancaria", id_caja_operacion_bancaria);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}
	@RequestMapping(value = "/jdDetalleDistribucionDeposito", method = RequestMethod.GET)
	public ModelAndView verDetalleDistribucionDeposito(@RequestParam String id_caja_operacion) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/jdDetalleDistribucionDeposito");
		//mv.addObject("id_liquidacion", id_liquidacion);
		 try {
			mv.addObject("lista_distribucion_deposito", logica_operaciones_cajeros.getDistribucionPorDeposito(id_caja_operacion));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}
	
	@RequestMapping(value = "/frmConsultarCajaOperacion.htm", method = RequestMethod.GET)
	public ModelAndView frmConsultarCajaOperacion(
			HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/cajapagos/frmConsultarCajaOperacion");
		List<ZonaTO> zonas = controlador_listas.getServicio_to().getListaZonasPorUsuario(user);
		mv.addObject("lista_zonas", zonas);
		mv.addObject("lista_localidades", controlador_listas.getServicio_to().getListaLocalidadesPorUsuario(user,zonas.get(0).getId_zona()));
		return mv;
	}
	
	@RequestMapping(value = "/frmFlujoProyectado.htm", method = RequestMethod.GET)
	public ModelAndView frmFlujoProyectado(HttpServletRequest request) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		ModelAndView mv = new ModelAndView("tesoreria/frmflujo_proyectado");
		return mv;
	}
	
	@RequestMapping(value = "/uploadFileFlujoProyectado", method = RequestMethod.POST) 
	  public Map<String, ? extends Object> processUpload(/*@RequestParam MultipartFile fileToUpload ,*/@RequestParam String qqfile,@RequestParam String anio, HttpServletRequest request){
		Map data = new HashMap();
		try {
		 // logger.info("========= upload file:" + filename.getOriginalFilename());
		  //you can do something with the uploaded file   
		  byte []leido = new byte[1024];
		  int len=-1;
		  int cont=0;
		  File f= new File(qqfile);
		  FileOutputStream fos = new FileOutputStream(f);
		  DataOutputStream dos = new DataOutputStream(fos);		  
		  while((len=request.getInputStream().read(leido))!=-1){
			  dos.write(leido,0,len);
		  }
		  dos.flush();
		  dos.close();
		  Utiles_Importar ui = new Utiles_Importar(f);
		 ArrayList datos = ui.getDatosHojaCobranza(0);
		 f.delete();
		 //Listar todos los datos
		 /* for(int i=0;i< datos.size();i++){
			  ArrayList dat_list = (ArrayList)datos.get(i);
			  for(int j=0;j< dat_list.size();j++){
				  String dato = dat_list.get(j).toString();
				  System.out.print(dato+"\t");
			  }
			  System.out.println();
		  }*/
			logica_flujo.insertaFlujoProyectado(anio, datos);
			data.put("respuesta", "Se cargo el archivo exitosamente!");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			data.put("respuesta", "Revise el archivo, su estructura es incorrecta");
			data.put("success", false);
			data.put("reason", "no idea");
			e.printStackTrace();
		}
		  return data;
		   
	  }
	
	// comparativo Fujo
	@RequestMapping(value = "/comparativo_flujo", method = RequestMethod.GET)
	public @ResponseBody
	List<ComparativoFlujoTO> getComparativoFlujo(@RequestParam String anio,@RequestParam int id_concepto,
			HttpServletResponse response) {
		String user = ((UserDetails) SecurityContextHolder.getContext()
				.getAuthentication().getPrincipal()).getUsername();
		List<ComparativoFlujoTO> lista=logica_flujo.getComparativoFlujo(anio,id_concepto);
		return lista;
	}
	
}
